package com.fingard.dsp.bank.directbank.smbc01;

import com.fingard.dsp.bank.directbank.DirectBase;
import com.fingard.dsp.bank.reqrespobj.foreigncurrsingle.ReqForeignCurrSingle;
import com.fingard.dsp.bank.reqrespobj.single.ReqSingle;
import com.fingard.io.FileHelper;
import com.fingard.text.StringHelper;
import com.fingard.util.DateHelper;
import com.fingard.util.ForeignBankUtil;

import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 三井住友
 * @version 1.0
 */
public class SMBC01Base extends DirectBase {

    public static ForeignBankUtil foreignBankHelper=null;

    protected String getCharset() {
        return getBankConfig().getCharset("utf-8");
    }

    /**
     * 拼接付款报文  人民币电汇  ok
     *
     * @return
     */
    protected StringBuilder PaymentXMLToFile(ReqSingle p_req1908) throws Exception{
        StringBuilder sb = new StringBuilder();
        sb.append("ENV,");//ENV	行识别符（ENV）	データ識別子(ENV)
        sb.append(",");//DEFAULTID
        sb.append("S,");//SM	汇款种类标志	S/M区分
        sb.append("U1,");//TRANSFERTYPE	汇款类型	送金種別
        sb.append(",");//DEBITTYPE
        sb.append(p_req1908.singleDetail.askNumber + ",");//CUSTREF	客户参考号	顧客整理番号
        if (getBankConfig().getValueAsBool("isBookDate")) {
            sb.append(DateHelper.convertD10toD8(p_req1908.singleDetail.bookDate) + ",");//VALUEDATE	起息日	送金希望日
        } else {
            sb.append(DateHelper.convertD10toD8(p_req1908.singleDetail.payDate) + ",");//VALUEDATE	起息日	送金希望日
        }
        sb.append("RMB,");//CCY	币种	送金通貨/換算通貨
        //DEBITBRANCHCD	汇款账号.行号	引落口座支店番号
        sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitbranchcd",p_req1908.singleDetail.payAct)+",");
        //DEBITGLCD	汇款账号.科目代码	Debit科目コード
        sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitglcd",p_req1908.singleDetail.payAct)+",");
        //DEBITGLSUBCD	汇款账号.科目子码	Debit科目サブコード
        sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitsubcd",p_req1908.singleDetail.payAct)+",");
        sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitorgid",p_req1908.singleDetail.payAct)+",");//DEBITSSNO	汇款账号.客户代码	Debit顧客番号
        sb.append(p_req1908.singleDetail.payAct+",");//DEBITACCOUNTNO	汇款账号	Debit口座番号
        sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitsubno",p_req1908.singleDetail.payAct)+",");//DEBITSUBNO	汇款账号.SUBNO	Debit顧客番号枝番
        sb.append("RMB,");//DEBITCCY	汇款账号.币种	Debit通貨
        sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitmktcd",p_req1908.singleDetail.payAct)+",");//DEBITMKTCD	汇款账号.MKT码	Debitマーケットコード
        sb.append(",");//CHARGEBRANCHCD
        sb.append(",");//CHARGEGLCD
        sb.append(",");//CHARGEGLSUBCD
        sb.append(",");//CHARGESSNO
        sb.append(",");//CHARGEACCOUNTNO
        sb.append(",");//CHARGESUBNO
        sb.append(",");//CHARGECCY
        sb.append(",");//CHARGEMKTCD
        sb.append(" ");//REMITCCY	汇款币种	送金通貨
        sb.append("\r\n");//换行
        sb.append("INS,");//INS 	行识别符（INS）	データ識別子(INS)
        sb.append(",");//DEFAULTID	-	デフォルトID
        sb.append(",");//PAYEENO	受益人编号（画面不显示）	受取人番号
        sb.append(getFormatString(p_req1908.singleDetail.recName)+",");//PAYEENAME	画面.[受益人].受益人名称	受取人名
        sb.append(",");//ADDRESS	画面.[受益人].地址	受取人住所
        sb.append(",");//PHONENO	画面.[受益人].电话	受取人電話番号
        sb.append(getFormatString(p_req1908.singleDetail.cnapsName)+",");//BANKNAME	画面.[银行].银行名称	受取人銀行名
        sb.append(",");//BANKCODE	画面.[银行].银行代码	受取人銀行コード
        sb.append(getBankAreaConfig().getMapValueByKey("areaMapping",p_req1908.singleDetail.recArea)+",");//BRANCHREGIONCD	银行所在地代码	支店所在地コード
        String recAreaName=p_req1908.singleDetail.recAreaName;
        recAreaName=recAreaName.contains("_")?recAreaName.substring(0,recAreaName.indexOf("_")):recAreaName;
        sb.append(getFormatString(recAreaName)+",");//BRANCHREGIONNAME	银行所在地名称	支店所在地名
        sb.append(getFormatString(p_req1908.singleDetail.cnapsName)+",");//BRANCHNAME	画面.[银行].分行名称	受取人銀行支店名
        sb.append(p_req1908.singleDetail.recAct+",");//ACCOUNTNO	画面.[受益人].账号	 受取人口座番号
        sb.append(p_req1908.singleDetail.payAmount+",");//PAYMENTAMOUNT	画面.金额	 送金金額
        String tmpPurpose = interceptUseage(getFormatString(p_req1908.singleDetail.purpose));
        sb.append(tmpPurpose + ",");//MESSAGE	画面.[附言].汇款附言 	受取人宛メッセージ
        sb.append(",");//OURCHARGE	画面.汇款费用	手数料負担先
        sb.append(",");//INSTRUCTIONREF	画面.客户参考号	お客様整理番号
        sb.append(",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,");
        return sb;
    }

    /**
     * ATSES-29370 三井住友对外付款用途字段超长
     * 用于判断用途字段长度是否过长，总字符60位，一个中文字符占2位
     */
    public String interceptUseage(String useage) {
        char[] useageChar = useage.toCharArray();
        StringBuilder newUseage = new StringBuilder();
        for (int i = 0, j = 0; i < 60 && j < useage.length(); j++) {
            if (isContainChinese(useageChar[j])) {
                i += 2;
            } else {
                i++;
            }
            newUseage.append(String.valueOf(useageChar[j]));
        }

        return newUseage.toString();
    }

    /**
     * 判断字符是否中文
     */
    public boolean isContainChinese(char tmpChar) {
        String tmpStr = tmpChar + "";
        Pattern p = Pattern.compile("[\u4E00-\u9FA5|\\！|\\，|\\。|\\（|\\）|\\《|\\》|\\“|\\”|\\？|\\：|\\；|\\【|\\】]");
        Matcher m = p.matcher(tmpStr);
        if (m.find()) {
            return true;
        }
        return false;
    }

    /**
     * 拼接付款报文  境内外币、跨境外币、跨境人民币、同行外币
     *
     * @return
     */
    protected StringBuilder PaymentXMLToFile(ReqForeignCurrSingle reqForeignCurrSingle) throws Exception{
        StringBuilder sb = new StringBuilder();
        sb.append("ENV,");//ENV	行识别符（ENV）	データ識別子(ENV)
        sb.append(",");//DEFAULTID
        sb.append("S,");//SM	汇款种类标志	S/M区分
        if("1".equals(reqForeignCurrSingle.singleDetail.sameBnk) && "1".equals(reqForeignCurrSingle.singleDetail.sameCity)){
            sb.append("IS,");//TRANSFERTYPE	汇款类型	送金種別  同行
        }else {
            if("1".equals(reqForeignCurrSingle.singleDetail.isDomestic)){//境内
                sb.append("O2,");
            }else if("0".equals(reqForeignCurrSingle.singleDetail.isDomestic)){//境外
                if("1".equals(reqForeignCurrSingle.singleDetail.payCur)){
                    sb.append("O1,");//人民币
                }else {
                    sb.append("O3,");//外币
                }
            }
        }
        sb.append(",");//DEBITTYPE
        sb.append(reqForeignCurrSingle.singleDetail.askNumber + ",");//CUSTREF	客户参考号	顧客整理番号
        sb.append(DateHelper.convertD10toD8(reqForeignCurrSingle.singleDetail.payDate) + ",");//VALUEDATE	起息日	送金希望日
        sb.append(convertCurToBank(reqForeignCurrSingle.singleDetail.payCur)+",");//CCY	币种	送金通貨/換算通貨
        //DEBITBRANCHCD	汇款账号.行号	引落口座支店番号
        sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitbranchcd",reqForeignCurrSingle.singleDetail.payAct)+",");
        //DEBITGLCD	汇款账号.科目代码	Debit科目コード
        sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitglcd",reqForeignCurrSingle.singleDetail.payAct)+",");
        //DEBITGLSUBCD	汇款账号.科目子码	Debit科目サブコード
        sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitsubcd",reqForeignCurrSingle.singleDetail.payAct)+",");
        sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitorgid",reqForeignCurrSingle.singleDetail.payAct)+",");//DEBITSSNO	汇款账号.客户代码	Debit顧客番号
        sb.append(reqForeignCurrSingle.singleDetail.payAct+",");//DEBITACCOUNTNO	汇款账号	Debit口座番号
        sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitsubno",reqForeignCurrSingle.singleDetail.payAct)+",");//DEBITSUBNO	汇款账号.SUBNO	Debit顧客番号枝番
        sb.append(convertCurToBank(reqForeignCurrSingle.singleDetail.payCur)+",");//DEBITCCY	汇款账号.币种	Debit通貨
        sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitmktcd",reqForeignCurrSingle.singleDetail.payAct)+",");//DEBITMKTCD	汇款账号.MKT码	Debitマーケットコード
        sb.append(",");//CHARGEBRANCHCD
        sb.append(",");//CHARGEGLCD
        sb.append(",");//CHARGEGLSUBCD
        sb.append(",");//CHARGESSNO
        sb.append(",");//CHARGEACCOUNTNO
        sb.append(",");//CHARGESUBNO
        sb.append(",");//CHARGECCY
        sb.append(",");//CHARGEMKTCD
        sb.append(convertCurToBank(StringHelper.hasAnyChar(reqForeignCurrSingle.singleDetail.recCur)
                ?reqForeignCurrSingle.singleDetail.recCur:reqForeignCurrSingle.singleDetail.payCur));//REMITCCY	汇款币种	送金通貨
        sb.append("\r\n");//换行
        sb.append("INS,");//INS 	行识别符（INS）	データ識別子(INS)
        sb.append(",");//DEFAULTID	-	デフォルトID
        sb.append(",");//PAYEENO	受益人编号（画面不显示）	受取人番号
        sb.append(getFormatString(reqForeignCurrSingle.singleDetail.recName)+",");//PAYEENAME	画面.[受益人].受益人名称	受取人名
        sb.append(",");//ADDRESS	画面.[受益人].地址	受取人住所
        sb.append(",");//PHONENO	画面.[受益人].电话	受取人電話番号
        String recBankName=reqForeignCurrSingle.singleDetail.recCNAPSName;
        if(StringHelper.isNullOrEmpty(recBankName)){
            recBankName=reqForeignCurrSingle.singleDetail.recBnkName;
        }
        sb.append(getFormatString(recBankName)+",");//BANKNAME	画面.[银行].银行名称	受取人銀行名
        //sb.append(reqForeignCurrSingle.singleDetail.recSWIFTCODE+",");//BANKCODE	画面.[银行].银行代码	受取人銀行コード
        sb.append(",");//BANKCODE	画面.[银行].银行代码	受取人銀行コード
        sb.append(",");//BRANCHREGIONCD	银行所在地代码	支店所在地コード
        sb.append(",");//BRANCHREGIONNAME	银行所在地名称	支店所在地名
        sb.append(getFormatString(recBankName)+",");//BRANCHNAME	画面.[银行].分行名称	受取人銀行支店名
        sb.append(reqForeignCurrSingle.singleDetail.recAct+",");//ACCOUNTNO	画面.[受益人].账号	 受取人口座番号
        sb.append(reqForeignCurrSingle.singleDetail.payAmount+",");//PAYMENTAMOUNT	画面.金额	 送金金額
        //MESSAGE	画面.[附言].汇款附言 	受取人宛メッセージ
        if(reqForeignCurrSingle.singleDetail.purpose.length()>49){
            sb.append(reqForeignCurrSingle.singleDetail.askNumber+",");
        }else {
            sb.append(getFormatString(reqForeignCurrSingle.singleDetail.purpose+" "+reqForeignCurrSingle.singleDetail.askNumber)+",");
        }
        if("OUR".equals(reqForeignCurrSingle.singleDetail.costMode)){
            sb.append("A,");//OURCHARGE	画面.汇款费用	手数料負担先  汇款人
        }else if("BEN".equals(reqForeignCurrSingle.singleDetail.costMode)){
            sb.append("B,");//收款人
        }else if("SHA".equals(reqForeignCurrSingle.singleDetail.costMode)){
            sb.append("S,");//共同
        }
        sb.append(",");//INSTRUCTIONREF	画面.客户参考号	お客様整理番号
        sb.append(",");//EMAILADDRESS
        sb.append(",");//EMAILNOTIFICATION
        sb.append(",");//ZIPCD
        sb.append(",");//FAXNO
        sb.append(",");//ATTENTION
        sb.append(",");//WHTID
        sb.append(",");//CARDID
        sb.append(",");//WHTFORMID
        sb.append(",");//FAXNOTIFICATION
        sb.append(",");//PICKUPID
        sb.append(",");//CALCMODEID
        sb.append(",");//INVOICEAMOUNT
        sb.append(",");//VATRATE
        sb.append(",");//WHTAMOUNT
        sb.append(",");//DISCOUNTAMOUNT
        sb.append(",");//REGISTEREDMAILADDRESS
        sb.append(",");//WHTORDERINGNO
        sb.append(",");//WHTREF
        sb.append(",");//REMARKS
        sb.append(",");//ONBEHALFOFNAME
        sb.append(",");//ONBEHALFOFADDRESS
        sb.append(",");//ONBEHALFOFWHTID
        sb.append(",");//INSTRUCTIONREF2
        sb.append(",");//TRANSACTIONCD
        sb.append(",");//INPUTKANA
        sb.append(",");//BANKADDRESS
        sb.append(",");//MEMO
        sb.append("TT"+",");//REMITTYPE	画面.汇款方式	送金方式 TT:电汇、DD:贷记凭证、MT:信汇、IT:内转
        if("1".equals(reqForeignCurrSingle.singleDetail.paySpd)){
            sb.append("UR,");//PRIORITY	画面.发电等级	発電レベル NO:普通、UR:緊急
        }else {
            sb.append("NO,");//PRIORITY	画面.发电等级	発電レベル NO:普通、UR:緊急
        }
        //汇款人
        sb.append(getFormatString(reqForeignCurrSingle.singleDetail.payName)+",");//PAYERNAME	画面.[汇款人].汇款人名称	送金者名称
        sb.append(",");//PAYERADDRESS	画面.[汇款人].地址	送金者住所
        if("1".equals(reqForeignCurrSingle.singleDetail.isPrivate)){
            sb.append("01,");//PAYERTYPE	画面.[汇款人].对公/对私	送金者区分 00:对公、01:对私
            sb.append(",");//UNITCODE	画面.[汇款人].组织机构代码 	送金者コード（企業）
            sb.append(reqForeignCurrSingle.singleDetail.certNum+",");//INDIVIDUALNO	画面.[汇款人].个人身份证件号码 	送金者コード（個人）
            if("DEI".equals(reqForeignCurrSingle.singleDetail.recType)){
                sb.append("00,");// INDIVIDUALTYPE	画面.[汇款人].中国居民个人/中国非居民个人	個人種別 00:中国居民個人01:中国非居民個人
            }else if("CNI".equals(reqForeignCurrSingle.singleDetail.recType)){
                sb.append("01,");// INDIVIDUALTYPE	画面.[汇款人].中国居民个人/中国非居民个人	個人種別 00:中国居民個人01:中国非居民個人
            }else {
                sb.append(",");// INDIVIDUALTYPE	画面.[汇款人].中国居民个人/中国非居民个人	個人種別 00:中国居民個人01:中国非居民個人
            }
        }else {
            sb.append("00,");//PAYERTYPE	画面.[汇款人].对公/对私	送金者区分 00:对公、01:对私
            sb.append(reqForeignCurrSingle.singleDetail.payOrgCode+",");//UNITCODE	画面.[汇款人].组织机构代码 	送金者コード（企業）
            sb.append(",");//INDIVIDUALNO	画面.[汇款人].个人身份证件号码 	送金者コード（個人）
            sb.append(",");// INDIVIDUALTYPE	画面.[汇款人].中国居民个人/中国非居民个人	個人種別
        }
        //收款人
        sb.append(",");//COUNTRYNAME	画面.[受益人].国家名称	受取人所在国名称
        sb.append(",");//BANKCOUNTRYNAME	画面.[受益人银行].银行所在国家名称	受取銀行所在国名称
        //代理人
        sb.append(getFormatString(reqForeignCurrSingle.singleDetail.recAgentBnkName)+",");//INTERMEDBANKNAME	画面.[代理银行].银行名称	経由行名称
        sb.append(reqForeignCurrSingle.singleDetail.recAgentBnkSWIFT+",");//INTERMEDBANKCODE	画面.[代理银行].银行代码	経由行コード
        sb.append(getFormatString(reqForeignCurrSingle.singleDetail.recAgentBnkName)+",");//INTERMEDBANKBRANCHNAME	画面.[代理银行].银行分行	経由行支店名
        sb.append(reqForeignCurrSingle.singleDetail.recAgentBnkCtryCode+",");//INTERMEDBANKCOUNTRYNAME	画面.[代理银行].银行所在国家名称	経由行所在国名
        sb.append(reqForeignCurrSingle.singleDetail.recAgentBnkAct+",");//INTERMEDBANKACCOUNTNO	画面.[代理银行].代理行账号	経由行口座番号
        //现汇
        if(StringHelper.hasAnyChar(reqForeignCurrSingle.singleDetail.payCashAct)){
            sb.append(reqForeignCurrSingle.singleDetail.payCashAmount+",");//FXAMOUNT	画面.现汇金额	现汇金額
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitbranchcd",reqForeignCurrSingle.singleDetail.payCashAct)+",");//FXDEBITBRANCHCD	现汇账号的分行代码（画面不显示）	现汇Debit支店番号
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitglcd",reqForeignCurrSingle.singleDetail.payCashAct)+",");//FXDEBITGLCD	画面.现汇账号所属科目代码	现汇Debit科目コード
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitsubcd",reqForeignCurrSingle.singleDetail.payCashAct)+",");//FXDEBITGLSUBCD	现汇账号所属子科目代码（画面不显示）	现汇Debit科目サブコード
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitorgid",reqForeignCurrSingle.singleDetail.payCashAct)+",");//FXDEBITSSNO	现汇账号客户代码（画面不显示）	现汇Debit顧客番号
            sb.append(reqForeignCurrSingle.singleDetail.payCashAct+",");//FXDEBITACCOUNTNO	画面.现汇账号	现汇Debit口座番号
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitsubno",reqForeignCurrSingle.singleDetail.payCashAct)+",");//FXDEBITSUBNO	画面.现汇账号SUBNO	现汇Debit顧客番号枝番
            sb.append(convertCurToBank(reqForeignCurrSingle.singleDetail.payCur)+",");//FXDEBITCCY	画面.现汇账号币种	现汇Debit通貨
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitmktcd",reqForeignCurrSingle.singleDetail.payCashAct)+",");//FXDEBITMKTCD	现汇账号MKTCD（画面不显示）	现汇Debitマーケットコード
        }else {
            sb.append(",");//FXAMOUNT	画面.现汇金额	现汇金額
            sb.append(",");//FXDEBITBRANCHCD	现汇账号的分行代码（画面不显示）	现汇Debit支店番号
            sb.append(",");//FXDEBITGLCD	画面.现汇账号所属科目代码	现汇Debit科目コード
            sb.append(",");//FXDEBITGLSUBCD	现汇账号所属子科目代码（画面不显示）	现汇Debit科目サブコード
            sb.append(",");//FXDEBITSSNO	现汇账号客户代码（画面不显示）	现汇Debit顧客番号
            sb.append(",");//FXDEBITACCOUNTNO	画面.现汇账号	现汇Debit口座番号
            sb.append(",");//FXDEBITSUBNO	画面.现汇账号SUBNO	现汇Debit顧客番号枝番
            sb.append(",");//FXDEBITCCY	画面.现汇账号币种	现汇Debit通貨
            sb.append(",");//FXDEBITMKTCD	现汇账号MKTCD（画面不显示）	现汇Debitマーケットコード
        }
        //购汇
        if(StringHelper.hasAnyChar(reqForeignCurrSingle.singleDetail.payPurchaseAct)){
            sb.append(reqForeignCurrSingle.singleDetail.payPurchaseAmt+",");//PURCHASEAMOUNT	画面.购汇金额	両替金額
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitbranchcd",reqForeignCurrSingle.singleDetail.payPurchaseAct)+",");//PURCHASEDEBITBRANCHCD	购汇账号分行代码（画面不显示）	両替Debit支店番号
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitglcd",reqForeignCurrSingle.singleDetail.payPurchaseAct)+",");//PURCHASEDEBITGLCD	画面.购汇账号所属科目代码	両替Debit科目コード
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitsubcd",reqForeignCurrSingle.singleDetail.payPurchaseAct)+",");//PURCHASEDEBITGLSUBCD	购汇账号所属子科目代码（画面不显示）	両替Debit科目サブコード
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitorgid",reqForeignCurrSingle.singleDetail.payPurchaseAct)+",");//PURCHASEDEBITSSNO	购汇账号客户代码（画面不显示）	両替Debit顧客番号
            sb.append(reqForeignCurrSingle.singleDetail.payPurchaseAct+",");//PURCHASEDEBITACCOUNTNO	画面.购汇账号	両替Debit口座番号
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitsubno",reqForeignCurrSingle.singleDetail.payPurchaseAct)+",");//PURCHASEDEBITSUBNO	画面.购汇账号SUBNO	両替Debit顧客番号枝番
            sb.append(convertCurToBank(reqForeignCurrSingle.singleDetail.payCur)+",");//PURCHASEDEBITCCY	画面.购汇账号币种	両替Debit通貨
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitmktcd",reqForeignCurrSingle.singleDetail.payPurchaseAct)+",");//PURCHASEDEBITMKTCD	购汇账号MKTCD（画面不显示）	両替Debitマーケットコード
        }else {
            sb.append(",");//FXAMOUNT	画面.现汇金额	现汇金額
            sb.append(",");//FXDEBITBRANCHCD	现汇账号的分行代码（画面不显示）	现汇Debit支店番号
            sb.append(",");//FXDEBITGLCD	画面.现汇账号所属科目代码	现汇Debit科目コード
            sb.append(",");//FXDEBITGLSUBCD	现汇账号所属子科目代码（画面不显示）	现汇Debit科目サブコード
            sb.append(",");//FXDEBITSSNO	现汇账号客户代码（画面不显示）	现汇Debit顧客番号
            sb.append(",");//FXDEBITACCOUNTNO	画面.现汇账号	现汇Debit口座番号
            sb.append(",");//FXDEBITSUBNO	画面.现汇账号SUBNO	现汇Debit顧客番号枝番
            sb.append(",");//FXDEBITCCY	画面.现汇账号币种	现汇Debit通貨
            sb.append(",");//FXDEBITMKTCD	现汇账号MKTCD（画面不显示）	现汇Debitマーケットコード
        }
        //其它
        if(StringHelper.hasAnyChar(reqForeignCurrSingle.singleDetail.payOtherAct)){
            sb.append(reqForeignCurrSingle.singleDetail.payOtherAmount+",");//OTHERAMOUNT	画面.其他金额	その他金額
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitbranchcd",reqForeignCurrSingle.singleDetail.payPurchaseAct)+",");//OTHERDEBITBRANCHCD	其他账号分行代码（画面不显示）	その他Debit支店番号
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitglcd",reqForeignCurrSingle.singleDetail.payPurchaseAct)+",");//OTHERDEBITGLCD	画面.其他账号所属科目代码	その他Debit科目コード
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitsubcd",reqForeignCurrSingle.singleDetail.payPurchaseAct)+",");//OTHERDEBITGLSUBCD	其他账号所属子科目代码（画面不显示）	その他Debit科目サブコード
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitorgid",reqForeignCurrSingle.singleDetail.payPurchaseAct)+",");//OTHERDEBITSSNO	其他账号客户代码（画面不显示）	その他Debit顧客番号
            sb.append(reqForeignCurrSingle.singleDetail.payOtherAct+",");// OTHERDEBITACCOUNTNO	画面.其他账号	その他Debit口座番号
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitsubno",reqForeignCurrSingle.singleDetail.payPurchaseAct)+",");//OTHERDEBITSUBNO	画面.其他账号SUBNO	その他Debit顧客番号枝番
            sb.append(convertCurToBank(reqForeignCurrSingle.singleDetail.payCur)+",");//OTHERDEBITCCY	画面.其他账号币种	その他Debit通貨
            sb.append(getBankConfig().getMapAdvanceValue("DrawInfo","key","debitmktcd",reqForeignCurrSingle.singleDetail.payPurchaseAct)+",");//OTHERDEBITMKTCD	其他账号MKTCD（画面不显示）	その他Debitマーケットコード
        }else {
            sb.append(",");//OTHERAMOUNT	画面.其他金额	その他金額
            sb.append(",");//OTHERDEBITBRANCHCD	其他账号分行代码（画面不显示）	その他Debit支店番号
            sb.append(",");//OTHERDEBITGLCD	画面.其他账号所属科目代码	その他Debit科目コード
            sb.append(",");//OTHERDEBITGLSUBCD	其他账号所属子科目代码（画面不显示）	その他Debit科目サブコード
            sb.append(",");//OTHERDEBITSSNO	其他账号客户代码（画面不显示）	その他Debit顧客番号
            sb.append(",");// OTHERDEBITACCOUNTNO	画面.其他账号	その他Debit口座番号
            sb.append(",");//OTHERDEBITSUBNO	画面.其他账号SUBNO	その他Debit顧客番号枝番
            sb.append(",");//OTHERDEBITCCY	画面.其他账号币种	その他Debit通貨
            sb.append(",");//OTHERDEBITMKTCD	其他账号MKTCD（画面不显示）	その他Debitマーケットコード
        }
        sb.append(getBankConfig().getMapKeyByValue("countryMapping",reqForeignCurrSingle.singleDetail.recCountryCode)+",");//LOCALCOUNTRYNAME	画面.[国际收支申报].收款人常驻国家/地区名称	LOCALCOUNTRYNAME
        //payMethod;//付款方式：A：预付货款，P：货到付款，R：退款，O：其他
        //送金種別 '01：预付货款（Advance Payment）、02：货到付款（Payment Against Delivery）、03：退款（Refund）、04：其他（Others）
        if("A".equals(reqForeignCurrSingle.singleDetail.payMethod)){
            sb.append("01,");// PAYMENTTYPE	画面.[国际收支申报].付汇类别
        }else if("P".equals(reqForeignCurrSingle.singleDetail.payMethod)){
            sb.append("02,");// PAYMENTTYPE	画面.[国际收支申报].付汇类别
        }else if("R".equals(reqForeignCurrSingle.singleDetail.payMethod)){
            sb.append("03,");// PAYMENTTYPE	画面.[国际收支申报].付汇类别
        }else if("O".equals(reqForeignCurrSingle.singleDetail.payMethod)){
            sb.append("04,");// PAYMENTTYPE	画面.[国际收支申报].付汇类别
        }
        /*'仅汇款类型为O2或IS时，必填
        01:保税区、
        02:出口加工区、
        03:钻石交易所、
        04:深加工结转、
        05:其他、
        06:其他特殊经济区域*/
        //payProperty;//付汇性质：X：保税区，E：出口加工区，D：钻石交易所，A：其他特殊经济区域，M：深加工结转，O：其他
        if("X".equals(reqForeignCurrSingle.singleDetail.payProperty)){
            sb.append("01,");// PAYMENTPROPERTY	画面.[国际收支申报].付汇性质	送金属性
        }else if("E".equals(reqForeignCurrSingle.singleDetail.payProperty)){
            sb.append("02,");// PAYMENTPROPERTY	画面.[国际收支申报].付汇性质	送金属性
        }else if("D".equals(reqForeignCurrSingle.singleDetail.payProperty)){
            sb.append("03,");// PAYMENTPROPERTY	画面.[国际收支申报].付汇性质	送金属性
        }else if("A".equals(reqForeignCurrSingle.singleDetail.payProperty)){
            sb.append("06,");// PAYMENTPROPERTY	画面.[国际收支申报].付汇性质	送金属性
        }else if("M".equals(reqForeignCurrSingle.singleDetail.payProperty)){
            sb.append("04,");// PAYMENTPROPERTY	画面.[国际收支申报].付汇性质	送金属性
        }else if("O".equals(reqForeignCurrSingle.singleDetail.payProperty)){
            sb.append("05,");// PAYMENTPROPERTY	画面.[国际收支申报].付汇性质	送金属性
        }
        sb.append(reqForeignCurrSingle.singleDetail.transCode1+",");//BOPTRANSCODE1	画面.[国际收支申报].交易编码（第一行）	取引コード１
        sb.append(convertCurToBank(reqForeignCurrSingle.singleDetail.currency1)+",");//BOPCCY1	画面.[国际收支申报].交易编码相应币种（第一行）	取引通貨１
        sb.append(reqForeignCurrSingle.singleDetail.amout1+",");//BOPAMOUNT1	画面.[国际收支申报].交易编码相应金额（第一行）	取引金額１
        sb.append(getFormatString(reqForeignCurrSingle.singleDetail.postScript1)+",");//BOPREMARKS1	画面.[国际收支申报].交易编码相应交易附言（第一行）	取引備考１
        sb.append(",");//VATAMOUNT	-	-
        sb.append(",");//        CALCTYPE	-	-
        sb.append(",");//        TAXCALCMETHODID	-	-
        sb.append(",");//        CHEQUENO	-	-
        sb.append(",");//        CLEARINGDATE	-	-
        sb.append(",");//        INVOICENO	-	-
        sb.append(",");//        DOCUMENTNO	-	-
        sb.append(",");//        REGIONOPTIONFLG	-	-
        sb.append(",");//        COMPANYID	-	-
        sb.append(",");//        SERVICECD	-	-
        sb.append(",");//        ENVELOPECD	-	-
        sb.append(",");//        INSTRUCTIONCD	-	-
        sb.append(",");//        COUNT	-	-
        sb.append(",");//        STATUS	-	-
        sb.append(",");//        STATUSREMARKS	-	-
        sb.append(",");//        BKBRSELECTFLG	-	-
        sb.append(",");//        NEWPAYEEFLG	-	-
        sb.append(",");//        WARNING	-	-
        sb.append(",");//        REGTIME	-	-
        sb.append(",");//        LASTUPDATETIME	-	-
        sb.append(reqForeignCurrSingle.singleDetail.transCode2+",");//        BOPTRANSCODE2	画面.[国际收支申报].交易编码（第二行）	取引コード２
        sb.append(convertCurToBank(reqForeignCurrSingle.singleDetail.currency2)+",");//BOPCCY2	画面.[国际收支申报].交易编码相应币种（第二行）	取引通貨２
        sb.append(reqForeignCurrSingle.singleDetail.amout2.equals("0")?"":reqForeignCurrSingle.singleDetail.amout2 +",");//BOPAMOUNT2	画面.[国际收支申报].交易编码相应金额（第二行）	取引金額２
        sb.append(getFormatString(reqForeignCurrSingle.singleDetail.postScript2)+",");//BOPREMARKS2	画面.[国际收支申报].交易编码相应交易附言（第二行）	取引備考２
        sb.append(",");//LASTSHIPMENTDATE	画面.[国际收支申报].最迟装运日期 	最終船積日付
        //isBondedGood;//保税货物项下付款：0：否，1：是
        sb.append(",");
        if("1".equals(reqForeignCurrSingle.singleDetail.isBondedGood)){
            sb.append("00,");//IMPORTINSPECTION	画面.[国际收支申报].本笔款项是否为保税货物项下付款	保税貨物支払 00:是、01:否
        }else if("0".equals(reqForeignCurrSingle.singleDetail.isBondedGood)){
            sb.append("01,");//IMPORTINSPECTION	画面.[国际收支申报].本笔款项是否为保税货物项下付款	保税貨物支払 00:是、01:否
        }
        sb.append(reqForeignCurrSingle.singleDetail.contractNo+",");//CONTRACTNO	画面.[国际收支申报].合同号 	契約番号
        sb.append(reqForeignCurrSingle.singleDetail.invoiceNo+",");//IMPORTINSPECTIONINVOICENO	画面.[国际收支申报].发票号	インボイス番号
        sb.append(reqForeignCurrSingle.singleDetail.businessNum+",");//SAFEAPPROVALNO	画面.[国际收支申报].外汇局批件号/备案表号/业务编号	外貨管理局（SAFE）認可番号等
        sb.append(",");//CUSTOMSUNITCODE	画面.[国际收支申报].报关单经营单位代码	通関単経営単位コード
        sb.append(getFormatString(reqForeignCurrSingle.singleDetail.contactPerson)+",");//APPLICANTNAME	画面.[其他].申请人名称	担当者名称
        sb.append(reqForeignCurrSingle.singleDetail.contactNum+",");//APPLICANTTELNO	画面.[其他].电话	電話番号
        sb.append(",");//MESSAGETOBANK	画面.[其他].备注	銀行宛備考
        sb.append(",");//COUNTRYCD	画面.受益人国家代码（画面不显示）	受取人国名コード
        sb.append(",");//BANKCOUNTRYCD	画面.受益人开户银行所在国家代码（画面不显示）	受取人銀行国名コード
        sb.append(reqForeignCurrSingle.singleDetail.recCountryCode+",");//LOCALCOUNTRYCODE	画面.[国际收支申报].收款人常驻国家/地区代码	受取人国コード
        //sb.append("\r\n");//CUSTOMSINFONO	该笔付汇关联报关单数	当該レコードに関連付く通関単情報の数
        /*sb.append(" ");//CUS	行识别符（CUS）	データ識別子(CUS) CUS行可不输出，若输出，则固定为‘CUS’
        sb.append(" ");//CUSTOMSCODE	报关单号	通関単番号
        sb.append(" ");//TOTALCCY	报关单币种	通関単通貨
        sb.append(" ");//TOTALAMOUNT	报关单总金额	通関単通貨
        sb.append(" ");//VERIFIEDCCY	本次核注币种	核消通貨
        sb.append(" ");//VERIFIEDAMOUNT	本次核注金额	核消金額*/
        return sb;
    }

    /**
     * 获取ack状态并写入文件
     * @param ackFilePath
     * @param payDate
     * @param rspStatus
     * @return
     * @throws Exception
     */
    protected void getAckStatus(String ackFilePath,String payDate,String[] rspStatus,String level) throws Exception{
        String ackFile=ackFilePath+File.separator+payDate+File.separator
                + "ACK"+File.separator +rspStatus[0]+File.separator+rspStatus[0]+"_"+level+".txt";
        String contents=rspStatus[0]+"|"+rspStatus[1]+"|"+rspStatus[2]+"|";
        if(!FileHelper.existFile(ackFile)){
            //写入文件
            FileHelper.appendFile(ackFile, contents, getCharset());
        }else {
            WriteBankLogLn("文件" + ackFile + "数据已被解析过");
        }
    }

    /**
     * 字符串格式化
     * @param content
     * @return
     */
    protected String getFormatString(String content){
        String result="";
        content = content.replace("，",",");
        if(content.contains(",") || content.contains("，")){
            result="\""+content+"\"";
        }else if(content.contains("&apos;")){
            result = content.replace("&apos;","'");
        }else if(content.contains("&amp;")){
            result = content.replace("&amp;","&");
        }else if(content.contains("&lt;")){
            result = content.replace("&lt;","<");
        }else if(content.contains("&gt;")){
            result = content.replace("&gt;",">");
        }else{
            result=content;
        }
        return result;
    }
}
